package com.kuang.controller.wxlogin;

import com.kuang.common.err.KuangShenException;
import com.kuang.config.wxlogin.WxConstantProperties;
import com.kuang.entity.User;
import com.kuang.service.JwtService;
import com.kuang.service.UserService;
import com.kuang.utils.httpclient.HttpClientUtils;
import com.kuang.utils.json.JsonUtil;
import com.kuang.vo.WeixinDataVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName LoginController
 * @Author ：xuke
 * @Date ：2021/1/17 12:59
 * @Description：
 * @Version: 1.0
 */
@RestController
@Slf4j
public class WeixinController {

    @Autowired
    private JwtService jwtService;
    @Autowired
    private UserService userService;

    /**
     * 微信登陆
     * @param weixinDataVo
     * @return
     */
    @GetMapping("/wxlogin")
    public WeixinDataVo weixinlogin(WeixinDataVo weixinDataVo) {
        // 1：判断code是否合法
        if (StringUtils.isEmpty(weixinDataVo.getCode())) {
            throw new KuangShenException(22008, "登录失败，尝试刷新重新扫码登录!");
        }

        // 2：通过code和appid和secret组装请求微信服务器的地址
        String loginUrl = "https://api.weixin.qq.com/sns/jscode2session" +
                "?appid=%s" +
                "&secret=%s" +
                "&js_code=%s" +
                "&grant_type=authorization_code";

        String loginResult = null;
        try {
            // 3：执行请求，获取微信请求返回得数据
            loginResult = new HttpClientUtils().get(String.format(loginUrl, WxConstantProperties.WX_OPEN_APP_ID, WxConstantProperties.WX_OPEN_APP_SECRET, weixinDataVo.getCode()));
            log.info("2---->微信返回的日志信息是：code:{},result：{}", weixinDataVo.getCode(), loginResult);
        } catch (Exception e) {
            throw new KuangShenException(22007, "登录失败，尝试刷新重新扫码登录!");
        }

        // 4： 对微信返回得数据进行转换
        Map<String, Object> resultMap = JsonUtil.string2Obj(loginResult, HashMap.class);
        log.info("3---->微信返回的日志信息是：code:{}，resultMap：{}", weixinDataVo.getCode(), resultMap);
        // 5: 解析微信用户得唯一凭证openid
        String openid = (String) resultMap.get("openid");
        if (StringUtils.isEmpty(openid)) {
            throw new KuangShenException(22009, "登录失败，尝试刷新重新扫码登录!!!");
        }

       //6：什么是openid：是小程序给每个用户生成的唯一用户标识，在开发中我们可以拿标识做为用户的唯一票据。直接使用openid判断一个用户是否被注册，
       // - 如果注册：直接根据openid查询用户信息，然后生成token返回，
       // - 如果没有没有注册：就进行用户的注册，并且生成token然后进行返回
        weixinDataVo.setOpenid(openid);
        User user = userService.wexinRegUser(weixinDataVo);
        log.info("1----------------保护用户信息是：{}",user);
        if(user !=null) {
            // 用户id一定要在生产token之前放进去
            weixinDataVo.setUserId(user.getId());
            // 生成token
            String token = jwtService.token(weixinDataVo);
            weixinDataVo.setToken(token);
            return weixinDataVo;
        }

        return  null;
    }
}